
import java.awt.*;
import java.awt.event.*;
import java.util.*;

/**
 * <p>
 * Representacao grafica na InterfaceDeUsuario de um Elevador.
 * </p>
 */
class RepresentacaoElevador {

  ///////////////////////////////////////
  // attributes


/**
 * <p>
 * Representa o numero de andares do predio.
 * </p>
 */
    private int numAndares; 

/**
 * <p>
 * Representa o andar em que se encontra o Elevador.
 * </p>
 */
    private int andarCorrente; 

/**
 * <p>
 * Indicador do Elevador representado (enumerados a partir de 1).
 * </p>
 */
    private int indElevador; 

/**
 * <p>
 * Identifica o aglomerado dos elementos graficos que representam o
 * Elevador.
 * </p>
 */
    private Panel panelBotoesInternosAndares; 

/**
 * <p>
 * Representa os rotulos a serem usados na interface de acordo com a sua
 * localizacao. Se nenhum parametro for colocado na linha de comando que
 * dispara a execucao do Simulador de Elevadores, entao a interface usa
 * rotulos em Portugues. Para usar rotulos em Ingles, por exemplo, o comando
 * </p>
 * <p>
 * %java SimuladorDeElevadores en US
 * </p>
 * <p>
 * deve ser dado, onde o primeiro argumento representa a lingua (en -
 * Ingles) e o segundo o pais (US - Estados Unidos). Os rotulos em Ingles
 * se encontram em Rotulos_en_US.properties. Os de Portugues do Brasil em
 * Rotulos_pt_BR.properties. Tais arquivos devem estar no mesmo diretorio
 * em que se encontrar o arquivo SimuladorDeElevadores.class.
 * </p>
 */
    private ResourceBundle rotulos; 

   ///////////////////////////////////////
   // associations

/**
 * <p>
 * Interface de usuario 'a qual esta' agregada a representacao grafica do
 * Elevador.
 * </p>
 */
    public InterfaceDeUsuarioSimples interfaceDeUsuarioSimples; 
/**
 * <p>
 * Representacoes graficas de instancias de BotaoDeSelecao instaladas no
 * Elevador.
 * </p>
 */
    private ArrayList<ArranjoBotaoInternoAndar> arranjoBotaoInternoAndar = new ArrayList<ArranjoBotaoInternoAndar>();

/**
 * <p>
 * Representacoes graficas de instancias de BotaoDeEmergencia instalado no
 * Elevador.
 * </p>
 */
    private ArranjoBotaoDeEmergencia arranjoBotaoDeEmergencia;


  ///////////////////////////////////////
  // operations


/**
 * <p>
 * Gera uma instancia de RepresentacaoElevador.
 * </p>
 * 
 * @param interfaceDeUsuario - InterfaceDeUsuarioSimples 'a qual se
 * encontra agregada a representacao grafica do Elevador.
 * 
 * @param interfaceDeUsuarioSimples 
 * @param rotulos 
 * @param indElevador - indicador do Elevador representado.
 * 
 * @param numAndares - numero de andares do predio
 * 
 * @param andarInicial - andar em que se encontra o Elevador quando
 * iniciada a aplicacao.
 * 
 * @param portaFechada - true se a Porta do Elevador estiver fachada quando
 * iniciada a aplicacao.
 * 
 * @return uma instancia de RepresentacaoElevador.
 */
    public  RepresentacaoElevador(InterfaceDeUsuarioSimples interfaceDeUsuarioSimples, ResourceBundle rotulos, int indElevador, int numAndares, int andarInicial, boolean portaFechada) {        
        GridLayout gridElevador;
        ArranjoBotaoInternoAndar arranjoBotaoInterno;
        ArranjoBotaoDeEmergencia arranjoBotaoDeEmergencia;
        int andar;
        this.interfaceDeUsuarioSimples = interfaceDeUsuarioSimples;
        this.rotulos = rotulos;
        this.indElevador = indElevador;
        this.numAndares = numAndares;
        this.andarCorrente = andarInicial;
        gridElevador = new GridLayout(numAndares + 3, 1, 0, 10);
        panelBotoesInternosAndares = new Panel(gridElevador);
        panelBotoesInternosAndares.add(new Label(rotulos.getString("botoesElevador") + " " + Integer.toString(indElevador), Label.CENTER));
        
        arranjoBotaoInternoAndar.ensureCapacity(numAndares + 1);
        arranjoBotaoInternoAndar.add(0, null);
        for (andar = 1; andar <= numAndares; andar++) {
            arranjoBotaoInterno = new ArranjoBotaoInternoAndar(this, indElevador, andar);
            arranjoBotaoInternoAndar.add(andar, arranjoBotaoInterno);
        }
        for (andar = numAndares; andar >= 1; andar--) {
            arranjoBotaoInterno = arranjoBotaoInternoAndar.get(andar);
            panelBotoesInternosAndares.add(arranjoBotaoInterno.getPanel());
        }
       
        panelBotoesInternosAndares.add(new Label(rotulos.getString("botaoDeEmergencia") , Label.CENTER));
        this.arranjoBotaoDeEmergencia = new ArranjoBotaoDeEmergencia(this, indElevador);
        
        panelBotoesInternosAndares.add(this.arranjoBotaoDeEmergencia.getPanel());
        

        registrarEstadoPorta(portaFechada);
        registrarPosicaoElevador(andarInicial);
    } // end RepresentacaoElevador        

/**
 * <p>
 * Retorna o andar em que se encontra o Elevador.
 * </p>
 * 
 * @return o numero do andar em que se encontra o Elevador.
 */
    public int getAndarCorrente() {        
        return andarCorrente;
    } // end getAndarCorrente        

/**
 * <p>
 * Atualiza a informacao sobre o andar em que se encontra o Elevador.
 * </p>
 * 
 * @param novoAndar - andar onde agora se encontra o Elevador.
 */
    public void setAndarCorrente(int novoAndar) {        
        andarCorrente = novoAndar;
    } // end setAndarCorrente        

/**
 * <p>
 * Recebe a informacao de que a representacao de um BotaoDeSelecao
 * instalado no Elevador foi acionado e repassa tal informacao.
 * </p>
 * 
 * @param andar - andar associado ao Botao.
 */
    public void registrarAcionamentoBotaoDeSelecao(int andar) {        
        interfaceDeUsuarioSimples.registrarAcionamentoBotaoDeSelecao(indElevador, andar);
    } // end registrarAcionamentoBotaoDeSelecao        

/**
 * <p>
 * Recebe a solicitacao de representar na InterfaceDeUsuarioSimples que o
 * BotaoDeSelecao representante do andar indicado foi armado.
 * </p>
 * 
 * @param andar - andar associado ao BotaoDeSelecao.
 */
    public void armarBotaoSelecao(int andar) {        
        getArranjoBotaoInternoAndar(andar).armarBotaoSelecao();
    } // end armarBotaoSelecao        

/**
 * <p>
 * Retorna a representacao grafica (ArranjoBotaoInternoAndar)do
 * BotaoDeSelecao associado ao andar indicado.
 * </p>
 * 
 * @return uma instancia de ArranjoBotaoInternoAndar.
 * 
 * @param andar - andar associado ao Botao.
 */
    private ArranjoBotaoInternoAndar getArranjoBotaoInternoAndar(int andar) {        
        return arranjoBotaoInternoAndar.get(andar);
    } // end getArranjoBotaoInternoAndar        

/**
 * <p>
 * Recebe a solicitacao de representar na InterfaceDeUsuarioSimples que o
 * BotaoDeSelecao representante do andar indicado foi desarmado.
 * </p>
 * 
 * @param andar - andar associado ao BotaoDeSelecao.
 */
    public void desarmarBotaoSelecao(int andar) {        
        getArranjoBotaoInternoAndar(andar).desarmarBotaoSelecao();
    } // end desarmarBotaoSelecao        

/**
 * <p>
 * Registra o estado da Porta do Elevador.
 * </p>
 * 
 * @param fechada - true se a Porta encontra-se fechada.
 */
    public void registrarEstadoPorta(boolean fechada) {        
        getArranjoBotaoInternoAndar(andarCorrente).registrarEstadoPorta(fechada);
    } // end registrarEstadoPorta        

/**
 * <p>
 * Registra nova posicao do Elevador.
 * </p>
 * 
 * @param andar - nova posicao do Elevador.
 */
    public void registrarPosicaoElevador(int andar) {        
        getArranjoBotaoInternoAndar(andarCorrente).removerElevador();
        andarCorrente = andar;
        getArranjoBotaoInternoAndar(andarCorrente).adicionarElevador();
    } // end registrarPosicaoElevador        

/**
 * <p>
 * Retorna o aglomerado (Panel) das representacoes graficas relacionadas
 * com as instancias de BotaoDeSelecao.
 * </p>
 * 
 * @return uma instancia de Panel.
 */
    public Panel getPanel() {        
        return panelBotoesInternosAndares;
    } // end getPanel        

    

/**
 * <p>
 * Recebe a informacao de que a representacao de um BotaoDeEmergencia
 * instalado no Elevador foi acionado e repassa tal informacao.
 * </p>
 */
    public void registrarAcionamentoBotaoDeEmergencia() {        
        interfaceDeUsuarioSimples.registrarAcionamentoBotaoDeEmergencia(indElevador);
    } // end registrarAcionamentoBotaoDeSelecao        

/**
 * <p>
 * Recebe a solicitacao de representar na InterfaceDeUsuarioSimples que o
 * BotaoDeEmergencia foi armado.
 * </p>
 */
    public void armarBotaoDeEmergencia() {        
        getArranjoBotaoDeEmergencia().armarBotaoDeEmergencia();
    } // end armarBotaoSelecao        


/**
 * <p>
 * Recebe a solicitacao de representar na InterfaceDeUsuarioSimples que o
 * BotaoDeEmergencia foi desarmado.
 * </p>
 */
    public void desarmarBotaoDeEmergencia() {        
    	getArranjoBotaoDeEmergencia().desarmarBotaoDeEmergencia();
    } // end desarmarBotaoSelecao        


/**
 * <p>
 * Retorna a representacao grafica (ArranjoBotaoInternoAndar)do
 * BotaoDeEmergencia
 * </p>
 * 
 * @return uma instancia de ArranjoBotaoInternoAndar.
 * 
 */
    private ArranjoBotaoDeEmergencia getArranjoBotaoDeEmergencia() {        
        return arranjoBotaoDeEmergencia;
    } // end getArranjoBotaoInternoAndar        


 } // end RepresentacaoElevador



